home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
oh!.2hd
/
OH!DEN_B.LZH
/
TOOLS
/
KEYWITCH
/
KW_S200.LZH
/
w11iocs.s
< prev
next >
Wrap
Text File
|
1995-03-20
|
13KB
|
630 lines
.include w03const.mac
.include w04macro.mac
.include w05reloc.mac
.text
.even
********************************
*キーデータバッファからデータを取り出す(_B_KEYINP)
* 処理は元のルーチンに任せ、ここではASK68KでSHIFTなどがロックしないようにする。
* 拡張キーデータバッファに対応する。
*>d0.l:スキャンコード*$100+文字コード,入力がなければ0
_b_keyinp::
bsr trans_extend *拡張バッファからキーデータバッファへ転送する
move.l ask_mode_area(pc),d0
beq _b_keyinp_4 *SHIFTなどがロックしないようにしない
pea.l _b_keyinp_1(pc)
_b_keyinp_4::
move.l old_b_keyinp(pc),-(sp) *元のルーチンを呼び出す
rts
_b_keyinp_1::
move.l a0,-(sp)
move.l d1,-(sp)
movea.l ask_mode_area(pc),a0
cmp.w #$7000,d0
blo _b_keyinp_2
beq _b_keyinp_shift_down *SHIFTが押された
cmp.w #$7200,d0
blo _b_keyinp_ctrl_down *CTRLが押された
beq _b_keyinp_opt1_down *OPT.1が押された
cmp.w #$F000,d0
blo _b_keyinp_2
beq _b_keyinp_shift_up *SHIFTが離された
cmp.w #$F200,d0
blo _b_keyinp_ctrl_up *CTRLが離された
beq _b_keyinp_opt1_up *OPT.1が離された
_b_keyinp_2::
move.l (sp)+,d1
movea.l (sp)+,a0
tst.l d0
rts
*OPT.1が離された
_b_keyinp_opt1_up::
moveq.l #$0000_0004,d1
bra _b_keyinp_3
*CTRLが離された
_b_keyinp_ctrl_up::
moveq.l #$0000_0002,d1
bra _b_keyinp_3
*SHIFTが離された
_b_keyinp_shift_up::
moveq.l #$0000_0000,d1
bra _b_keyinp_3
*OPT.1が押された
_b_keyinp_opt1_down::
move.l #$4000_0004,d1
bra _b_keyinp_3
*CTRLが押された
_b_keyinp_ctrl_down::
move.l #$8000_0002,d1
bra _b_keyinp_3
*SHIFTが押された
_b_keyinp_shift_down::
move.l #$0800_0000,d1
*<d1.l:設定するデータ*$10000+フラグの位置(オフセット)
_b_keyinp_3::
adda.w d1,a0 *オフセットを加える(+0/2/4)
swap.w d1
move.w d1,(a0) *フラグを更新する
bra _b_keyinp_2
********************************
*キーデータバッファの先頭のデータを見る(_B_KEYSNS)
* 拡張キーデータバッファに対応する。
*>d0.l:$10000+スキャンコード*$100+文字コード,入力がなければ0
_b_keysns::
bsr trans_extend *拡張バッファからキーデータバッファへ転送する
move.l old_b_keysns(pc),-(sp) *元のルーチンを呼び出す
rts
********************************
*キーボード関係の初期化(_KEYINIT)
*<d1.b:LEDの初期状態
*?d0
_key_init::
movem.l d1-d2/a0/a6,-(sp)
lea.l base(pc),a6
*割り込み禁止
di *割り込み禁止
*キーデータバッファ、BITSNSなどのワークを初期化
lea.l BITSNS.w,a0 *IOCSのBITSNSワークのアドレス
moveq.l #0,d0
moveq.l #(BUFEND-BITSNS)/4-1,d2
init_clear_1::
move.l d0,(a0)+ *BITSNSワークとキーデータバッファを初期化
dbra d2,init_clear_1
lea.l KEYBUF.w,a0 *キーデータバッファの先頭
move.l a0,BUFRED.w *最初のデータの位置
move.l a0,BUFWRT.w *最後のデータの位置
* move.w d0,BUFCNT.w *キーデータバッファ内のデータ数
*拡張バッファを初期化
tst.b (extend_flag)r
beq init_clear_3
* moveq.l #0,d0
movea.l (extend_head)r,a0 *拡張バッファの先頭
move.l a0,(extend_read)r *最初のデータの位置
move.w d0,(extend_used)r *データ数
move.w (extend_size)r,d2 *拡張バッファのサイズ
subq.w #1,d2
@@: move.w d0,(a0)+ *バッファを初期化
dbra d2,@b
subq.w #2,a0
move.l a0,(extend_last)r *最後のデータの位置
init_clear_3::
*マトリクスとキューを初期化
lea.l (matrix_bits)r,a0
* moveq.l #0,d0
moveq.l #(queue_head+Q_SIZE-matrix_bits)/4-1,d2
init_clear_2::
move.l d0,(a0)+ *マトリクスとキューを初期化
dbra d2,init_clear_2
*LEDの状態を初期化
and.b #$7F,d1
move.b d1,LEDSNS.w *LEDの初期状態
lsl.b #4,d1
move.b d1,SFTSNS.w *シフトキーの初期状態
*割り込みマスクを初期化
bset.b #4,IMRA *キー入力割り込みマスクセット
nop
nop
bset.b #3,SYSTEM3 *キーデータ送出許可
*キーボードの初期化
moveq.l #$41,d0 *マウスコントロール準備
bsr key_out
moveq.l #$49,d0 *キーボードロック解除(Compact)
bsr key_out
moveq.l #$59,d0 *キーデータ送出許可
bsr key_out
moveq.l #$51,d0 *X1コンパチ解除
bsr key_out
moveq.l #1,d0
and.b SR_OPT2,d0 *OPT.2をテレビコントロールに使用するか
or.b #$5C,d0 *テレビコントロールの使用状態
bsr key_out
move.b SR_DLY,d1 *リピート開始時間
bsr _keydly
move.b SR_REP,d1 *リピート間隔
bsr _keyrep
moveq.l #$54,d0 *LEDの明るさ(最も明るく)
bsr key_out
*LEDの初期化
tst.b (lock_mode)r
beq init_unlocked *キー入力禁止モードではない
moveq.l #$80,d0 *すべてのLEDを点灯する
bsr key_out
bra init_locked
init_unlocked::
bsr _ledset *LEDの状態を初期化
init_locked::
*キーボードの種類を判別する
sf.b (compact_flag)r *フラグをリセット
moveq.l #$47,d0 *Compactチェック
bsr key_out *$FEが返ればCompact
*割り込みレベルを復元
ei *割り込みレベルを復元
movem.l (sp)+,d1-d2/a0/a6
rts
********************************
*スキャンコードを文字コードに変換してキーデータバッファに転送する(_SKEYSET)
*<d1.b:スキャンコード(最上位ビットはキーが押された=0/離された=1)
*>d0.b:スキャンコード(最上位ビットはキーが押された=0/離された=1)
_skeyset::
*レジスタ待避
move.w sr,-(sp)
movem.l d1-d7/a0-a4/a6,-(sp)
*相対アドレッシングのためのベースレジスタの設定
lea.l base(pc),a6
*KWCallを分離
cmp.w #$FFFF,d1
beq _skeyset_1 *KWCallの呼び出し
move.l d1,-(sp)
*Interrupt発生時のためのsspを設定
lea.l 4*14(sp),a0 *プッシュしたレジスタの個数に注意
move.l a0,(interrupt_ssp)r
*キー入力割り込みを禁止する
di_key *キー入力割り込みを禁止する
*_SKEYSETメインを呼び出す
bsr skeyset_main *_SKEYSETメイン
*キー入力割り込みマスクを復元する
ei_key *キー入力割り込みマスクを復元する
*レジスタ復元
move.l (sp)+,d0
_skeyset_9::
movem.l (sp)+,d1-d7/a0-a4/a6
move.w (sp)+,sr
rts
*KWCall
_skeyset_1::
swap.w d1
*<d1.w:KWCall番号
moveq.l #-1,d0 *エラーコード
cmp.w #(2f-1f)/2,d1
bcc _skeyset_9
add.w d1,d1
move.w 1f(pc,d1.w),d1
jsr 1f(pc,d1.w)
bra _skeyset_9
1: .dc.w ~__KWVersion-1b
.dc.w ~__KWSimulate-1b
.dc.w ~__KWPush-1b
.dc.w ~__KWSetTask-1b
.dc.w ~__KWIventProc-1b
.dc.w ~__KWKeyProc-1b
.dc.w ~__KWIntMode-1b
.dc.w ~__KWRepeatMap-1b
.dc.w ~__KWStopMap-1b
.dc.w ~__KWAskMode-1b
.dc.w ~__KWAsk-1b
.dc.w ~__KWExtend-1b
.dc.w ~__KWClick-1b
.dc.w ~__KWDelay-1b
.dc.w ~__KWFull-1b
.dc.w ~__KWLock-1b
.dc.w ~__KWJoyKey-1b
.dc.w ~__KWLed-1b
.dc.w ~__KWMeta-1b
.dc.w ~__KWRepeat-1b
.dc.w ~__KWProgram-1b
.dc.w ~__KWStop-1b
.dc.w ~__KWTvKey-1b
.dc.w ~__KWExchange-1b
.dc.w ~__KWDevice-1b
.dc.w ~__KWCompact-1b
.dc.w ~__KWLockMode-1b
.dc.w ~__KWNumLed-1b
.dc.w ~__KWLedMap-1b
.dc.w ~__KWJoy1Map-1b
.dc.w ~__KWJoy2Map-1b
2:
~__KWVersion::
move.l #'KW'*$10000+$0200,d0
rts
~__KWSimulate::
move.w d2,d1
move.w d1,-(sp)
bsr simulate_main
moveq.l #0,d0
move.w (sp)+,d0
rts
~__KWPush::
move.w d2,d0
bra s_push
~__KWSetTask::
lea.l (active_task)r,a0
kwcall_setpoint::
move.l (a0),d0
move.l a1,d1
bmi @f
move.l a1,(a0)
@@: rts
~__KWIventProc::
cmp.w #(sbreak_proc-break_proc)/4,d2
bhi @f
lea.l (break_proc)r,a0
add.w d2,d2
add.w d2,d2
adda.w d2,a0
move.l (a0),d0
move.l a1,d1
bmi @f
move.l d1,(a0)
@@: rts
~__KWKeyProc::
lea.l (skeyset_proc)r,a0
bra kwcall_setpoint
~__KWIntMode::
lea.l (int_mode)r,a0
bra kwcall_flags
~__KWRepeatMap::
lea.l (live_repeat_bits)r,a0
kwcall_repeat::
move.l a0,d0
move.l a1,d1
bmi @f
.rept 16/4
move.l (a1)+,(a0)+
.endm
@@: rts
~__KWStopMap::
lea.l (kill_repeat_bits)r,a0
bra kwcall_repeat
~__KWAskMode::
move.l (ask_flag_bits)r,d0
rts
~__KWAsk::
moveq.l #1,d0
and.b (ask_flag)r,d0
rts
~__KWExtend::
moveq.l #1,d0
and.b (extend_flag)r,d0
rts
~__KWClick::
lea.l (compact_flag)r,a0
bra kwcall_flags
~__KWDelay::
lea.l (delay_flag)r,a0
bra kwcall_flags
~__KWFull::
lea.l (full_flag)r,a0
bra kwcall_flags
~__KWLock::
lea.l (lock_flag)r,a0
bra kwcall_flags
~__KWJoyKey::
lea.l (joykey_flag)r,a0
bra kwcall_flags
~__KWLed::
lea.l (led_flag)r,a0
bra kwcall_flags
~__KWMeta::
lea.l (meta_flag)r,a0
bra kwcall_flags
~__KWRepeat::
lea.l (repeat_flag)r,a0
bra kwcall_flags
~__KWProgram::
lea.l (prog_flag)r,a0
bra kwcall_flags
~__KWStop::
lea.l (stop_flag)r,a0
bra kwcall_flags
~__KWTvKey::
lea.l (tvkey_flag)r,a0
bra kwcall_flags
~__KWExchange::
lea.l (exchange_flag)r,a0
bra kwcall_flags
~__KWDevice::
moveq.l #1,d0
and.b (device_flag)r,d0
rts
~__KWCompact::
lea.l (compact_flag)r,a0
bra kwcall_flags
~__KWLockMode::
moveq.l #1,d0
and.b (lock_mode)r,d0
kwcall_rts::
rts
~__KWNumLed::
lea.l (num_led)r,a0
bsr kwcall_flags
bra _numset
~__KWLedMap::
lea.l (led_map)r,a0
move.l a0,d0
move.l a1,d1
bmi kwcall_rts
moveq.l #7-1,d1
bra kwcall_minimap
~__KWJoy1Map::
lea.l (joy1_map)r,a0
kwcall_joymap::
move.l a0,d0
move.l a1,d1
bmi 2f
moveq.l #8-1,d1
kwcall_minimap::
1: move.b (a1)+,(a0)+
dbra d1,1b
2: rts
~__KWJoy2Map::
lea.l (joy2_map)r,a0
bra kwcall_joymap
kwcall_flags::
moveq.l #1,d0
and.b (a0),d0
tst.l d2
bmi @f
sne.b (a0)
@@: rts
********************************
*LEDの状態をまとめて設定する(_LEDCTRL)
*<d1.b:LEDの状態(1のビットが点灯,最上位ビットは無視)
*?d0
_ledctrl::
move.b lock_mode(pc),d0
bne _ledctrl_3 *禁止されているときは操作させない
move.b led_flag(pc),d0
beq _ledctrl_4 *LEDを入れ替えない
move.l a0,-(sp)
move.l d2,-(sp)
lea.l led_map(pc),a0 *LEDの入れ替えテーブル
moveq.l #-1,d0
moveq.l #7-1,d2
_ledctrl_1::
btst.l d2,d1
beq _ledctrl_2 *消灯する
and.b (a0,d2.w),d0 *点灯するLEDのビットをクリア
_ledctrl_2::
dbra d2,_ledctrl_1
bsr key_out *キーポートに出力する
move.l (sp)+,d2
movea.l (sp)+,a0
_ledctrl_3::
rts
_ledctrl_0::
*LEDを入れ替えない
_ledctrl_4::
move.b d1,d0 *LEDの状態
not.b d0
tas.b d0
* bra key_out *キーポートに出力する
********************************
*キーポートに出力する
*<d0.b:出力データ
key_out::
tst.b TSR
bpl key_out *出力中
move.b d0,UDR *キーポートに出力する
rts
********************************
*NUMキーのLEDの状態を初期化する
*?d0
_numset::
move.b (lock_mode)r,d0
bne _numset_9
moveq.l #1,d0
and.b (num_led)r,d0 *NUMキーのLEDの状態
or.b #$44,d0
bra key_out
_numset_9::
rts
********************************
*LEDの状態を初期化する(_LEDSET)
_ledset::
move.w d1,-(sp)
move.l d0,-(sp)
move.b LEDSNS.w,d1 *LEDの状態
bsr _ledctrl
move.l (sp)+,d0
move.w (sp)+,d1
rts
********************************
*リピート開始時間を設定する(_KEYDLY)
*<d1.b:リピート開始時間
*?d0
_keydly::
moveq.l #$0F,d0
and.b d1,d0
or.b #$60,d0
bra key_out *キーポートに出力する
********************************
*リピート間隔を設定する(_KEYREP)
*<d1.b:リピート間隔
*?d0
_keyrep::
moveq.l #$0F,d0
and.b d1,d0
or.b #$70,d0
bra key_out *キーポートに出力する
********************************
*LEDの状態を設定する(_LEDMOD)
*<d1.l:LEDの番号
*<d2.b:消灯=0/点灯=1
*>d0.l:エラーなし=0/あり=-1
_ledmod::
move.l a4,-(sp)
lea.l BITSNS.w,a4 *IOCSのBITSNSワークのアドレス
move.b lock_mode(pc),d0
beq _ledmod_unlocked *禁止されていない
lea.l lock_map(pc),a4 *禁止状態で使うマップ
_ledmod_unlocked::
moveq.l #-1,d0 *エラーのときの返却値
cmp.b #6,d1
bhi _ledmod_9 *LEDの番号がおかしい
tst.b d2
beq _ledmod_0 *消灯する
*点灯する
bset.b d1,LEDSNS-BITSNS(a4)
bne _ledmod_8 *既に点灯していた
move.b d1,d0
subq.b #2,d0
bpl _ledmod_1 *かな,ローマ字以外
subq.b #1,d0
and.b d0,LEDSNS-BITSNS(a4) *かなとローマ字は同時に点灯しない
bra _ledmod_1
*消灯する
_ledmod_0::
bclr.b d1,LEDSNS-BITSNS(a4)
beq _ledmod_8 *既に消灯していた
_ledmod_1::
cmp.b #4,d1
bhs _ledmod_2 *LEDSNSの下半分は変化していない
move.w LEDSNS-BITSNS(a4),d0 *LEDSNSの下半分をSFTSNSの上半分にコピー
lsl.b #4,d0
lsr.w #4,d0
move.b d0,SFTSNS-BITSNS(a4)
_ledmod_2::
bsr _ledset *LEDの状態を設定
_ledmod_8::
moveq.l #0,d0 *エラーなし
_ledmod_9::
movea.l (sp)+,a4
rts
********************************
*ジョイスティックのデータを読み込む(_JOYGET)
* ジョイスティックからの入力は元のルーチンに任せ、キー入力のみ処理する。
* メガドライブ用ジョイスティックやマルチセレクタなどは、
* 他の常駐プログラムで対応する。
*<d1.w:ジョイスティックの番号(標準より少し拡張)
* bit0:ジョイスティック1=0/ジョイスティック2=1
* bit7:入力=0/その他=1
*>d0.b:ジョイスティックのデータ(ON=0/OFF=1)
* bit7:1(拡張用)
* bit6:Bボタン
* bit5:Aボタン
* bit4:1(拡張用)
* bit3:右
* bit2:左
* bit1:下
* bit0:上
_joyget::
move.l d1,-(sp) *ジョイスティックの番号
pea.l _joyget_1(pc)
move.l old_joyget(pc),-(sp) *元のルーチンを呼び出す
rts
_joyget_1::
move.b joykey_flag(pc),d1
beq _joyget_end *キーボードからジョイスティックの操作をしない
*パラメータを確認
move.b 3(sp),d1 *ジョイスティックの番号
bmi _joyget_end *接続の確認など
*キーの状態をジョイスティックからの入力に反映させる
movem.l d2-d4/a0-a1,-(sp)
lea.l joy1_map(pc),a0 *ジョイスティック1のキーの割り当て
lsr.w #1,d1 *bit0だけチェックする
bcc _joyget_stick_1
lea.l joy2_map(pc),a0 *ジョイスティック2のキーの割り当て
_joyget_stick_1::
lea.l BITSNS.w,a1 *IOCSのBITSNSワークのアドレス
moveq.l #0,d2
moveq.l #-1,d4
moveq.l #8-1,d1 *標準で常に1のビットも操作する
_joyget_loop::
move.b (a0,d1.w),d2 *スキャンコード
beq _joyget_keyup *割り当てられていない
move.b d2,d3
lsr.w #3,d2
btst.b d3,(a1,d2.w) *キーの状態を確認
beq _joyget_keyup *対応するキーが押されていない
bclr.l d1,d4 *入力に反映させる
_joyget_keyup::
dbra d1,_joyget_loop
*上と下が同時に押されていないか
moveq.l #%00000011,d1 *bit0:上/bit1:下
and.b d4,d1
bne _joyget_up_down_0 *同時に押されていない
addq.b #%00000011,d4 *両方キャンセルする
_joyget_up_down_0::
*左と右が同時に押されていないか
moveq.l #%00001100,d1 *bit2:左/bit3:右
and.b d4,d1
bne _joyget_left_right_0 *同時に押されていない
add.b #%00001100,d4 *両方キャンセルする
_joyget_left_right_0::
*キーボードの情報を合成する
and.b d4,d0
movem.l (sp)+,d2-d4/a0-a1
*JOYGET終わり
_joyget_end::
move.l (sp)+,d1
tst.b d0
rts